import tensorflow as tf

a = 1.2
aa = tf.constant(1.2)  # tf创建标量的方式
type(a), type(aa), tf.is_tensor(aa)

# 如果要使用TensorFlow的功能函数，必须通过TensorFlow规定的方式去创建张量，
# 而不能用Python语言的标准变量创建方式

x = tf.constant([1.2, 3.4])
print(x)

# 将tf张量的数据导出为numpy数组格式
x = x.numpy()
print(x)

# 创建向量须通过list容器传递给tf.constant()函数
a = tf.constant([1.2])
print(a)
print(a.shape)
# 创建二维向量
a = tf.constant([[1.2, 2], [2, 3]])
print(a)
# 创建三维向量
a = tf.constant([[[1.2, 2], [2, 3]], [[1.2, 2], [2, 3]]])
print(a)

# 创建字符串
a = tf.constant("Hello Deep learning!")
print(a)
# 将字符串传化为小写
a = tf.strings.lower(a)
print(a)
# 将字符串传化为大写
a = tf.strings.upper(a)
print(a)

# 创建bool张量，
# a = tf.constant([True, False])
a = tf.constant(True)
# tensorflow中的bool值和Python中的bool值并不等价
print(a is True)
print(a == True)  # 仅仅是数值比较

# 指定精度
a = tf.constant(123456789, dtype=tf.int32)
print(a)
# 读取精度
print('before:', a.dtype)

# 转换精度  tf.cast(a, tf.int64) 注意将高精度转低精度是可能发生数据溢出的情况
if (a.dtype != tf.int64):
    a = tf.cast(a, tf.int64)
print('after:', a.dtype)

# 待优化张量
demo = tf.constant([-1, 1, 4, 5])
a = tf.Variable(a)  # 转化为Variable 类型，这时trainable 为true 标识当前张量是否需要被优化
# 也可直接创建
demo = tf.Variable([1, 2, 3, 4, 5])
# 普通张量也可以通过GradientTape.watch()方法临时加入跟踪梯度信息列表，从而支持自动求导

